#include"Thread.hpp"
#include<memory>

pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;

// 1. 多个执行流进行安全访问的共享资源 - 临界资源
// 2. 我们把多个执行流中，访问临界资源的代码 -- 临界区 -- 往往是线程代码的很小的一部分
// 3. 想让多个线程串行访问共享资源 -- 互斥
// 4. 对一个资源进行访问的时候，要么不做，要么做完 -- 原子性 ， 不是原子性的情况 -- 一个对资源进行的操作，如果只用一条汇编就能完成 -- 原子性
// 反之：不是原子的 -- 当前理解，方便表述
//共享资源
int tickets=10000;
void* getticket(void* args)
{
    std::string username=static_cast<const char*>(args);
    while(true)
    {
        //枷锁
        pthread_mutex_lock(&lock);
        if(tickets>0)
        {
            usleep(1234);
            std::cout<<username<<"正在进行抢票"<<tickets<<std::endl;
            tickets--;
            //解锁
            pthread_mutex_unlock(&lock);
        }
        else
        {
            pthread_mutex_unlock(&lock);
            break;
        }
    }
    return nullptr;
}
// void* thread_run(void* args)
// {
//     std::string work_type=static_cast<const char*>(args);
//     while(true)
//     {
//         std::cout<<"我是一个新线程,我正在做:"<<work_type<<std::endl;
//         sleep(1);
//     }
// }

int main()
{
    std::unique_ptr<Thread> thread1(new Thread(getticket,(void*)"user1",1));
    std::unique_ptr<Thread> thread2(new Thread(getticket,(void*)"user2",2));
    std::unique_ptr<Thread> thread3(new Thread(getticket,(void*)"user3",3));
    std::unique_ptr<Thread> thread4(new Thread(getticket,(void*)"user4",4));

    thread1->join();
    thread2->join();
    thread3->join();
    thread4->join();


    return 0;
}